package cn.tedu.mall.seckill.service.impl;

import cn.tedu.mall.pojo.product.vo.SkuStandardVO;
import cn.tedu.mall.pojo.product.vo.SpuDetailStandardVO;
import cn.tedu.mall.pojo.product.vo.SpuStandardVO;
import cn.tedu.mall.pojo.seckill.model.SeckillSku;
import cn.tedu.mall.pojo.seckill.model.SeckillSpu;
import cn.tedu.mall.pojo.seckill.vo.SeckillSkuVO;
import cn.tedu.mall.pojo.seckill.vo.SeckillSpuDetailSimpleVO;
import cn.tedu.mall.pojo.seckill.vo.SeckillSpuVO;
import cn.tedu.mall.product.service.ISkuService;
import cn.tedu.mall.product.service.front.IForFrontSkuService;
import cn.tedu.mall.product.service.seckill.IForSeckillSkuService;
import cn.tedu.mall.product.service.seckill.IForSeckillSpuService;
import cn.tedu.mall.seckill.mapper.SeckillSkuMapper;
import cn.tedu.mall.seckill.mapper.SeckillSpuMapper;
import cn.tedu.mall.seckill.service.ISeckillSkuService;
import cn.tedu.mall.seckill.service.ISeckillSpuService;
import cn.tedu.mall.seckill.utils.SeckillCacheUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author BJ
 * @date 2022/11/8 20:47
 */
@Service
@Slf4j
public class SeckillSkuServiceImpl implements ISeckillSkuService {
    @Autowired
    private SeckillSkuMapper skuMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @DubboReference
    private IForSeckillSkuService skuService;

    // 查询 要秒杀的sku商品
    @Override
    public List<SeckillSkuVO> listSeckillSkus(Long spuId) {
        // 根据秒杀的spuId查询要秒杀的sku
        List<SeckillSku> seckillSkus = skuMapper.findSeckillSkusBySpuId(spuId);
        List<SeckillSkuVO> seckillSkuVOS = null;
        for (SeckillSku seckillSku : seckillSkus) {
            Long skuId = seckillSku.getSkuId();
            // 得到 sku商品在Redis中的 key
            String seckillSkuVOKey = SeckillCacheUtils.getSeckillSkuVOKey(skuId);
            SeckillSkuVO seckillSkuVO = null;
            // 判断Redis中是否有这个key
            if (redisTemplate.hasKey(seckillSkuVOKey)) {
                // 存在key ,返回秒杀的sku信息
                seckillSkuVO = (SeckillSkuVO) redisTemplate.boundValueOps(seckillSkuVOKey).get();
            } else {
                // 根据spuId查询sku商品的标准信息
                SkuStandardVO skuStandardVO = skuService.getById(skuId);
                seckillSkuVO = new SeckillSkuVO();
                // 【属性赋值】
                BeanUtils.copyProperties(skuStandardVO, seckillSkuVO);
                seckillSkuVO.setSeckillPrice(seckillSku.getSeckillPrice());
                seckillSkuVO.setSeckillLimit(seckillSku.getSeckillLimit());
                seckillSkuVO.setStock(seckillSku.getSeckillStock());
                // 【将每一个要秒杀的sku商品保存进Redis中】
                redisTemplate.boundValueOps(seckillSkuVOKey).set(seckillSkuVO,
                        125 * 60 * 1000 + RandomUtils.nextInt(10000), TimeUnit.MILLISECONDS);
            }
            seckillSkuVOS.add(seckillSkuVO);
        }
        return seckillSkuVOS;
    }
}
